opencv像素值运算 |
您所在的位置:网站首页 › 曲线角点检测 cpda › opencv像素值运算 |
c++ opencv像素值运算–辅助文档角点判断
现有一组vector< Point > 类型的corners 角点坐标(通过拟合文档边框,计算交点获得) 还有一Mat类型的二值化文档轮廓图(将文档图片经过Canny轮廓提取+findContours() 轮廓检测函数处理获得) 由于角点是以霍夫变换后的直线计算交点得来的,所以有些点并不在真正的文档角点上,需要判断哪些角点找对了位置,哪些没有。 为此暂时考虑尝试通过 获取文档轮廓图中 的角点附近 像素值的方法进行计算。 文档轮廓图(二值化)如下 首先参考Mat类型图像的像素点访问方法 代码如下: 写出获取角点附近8*8像素点的方式 //vector corners;//角点 //Mat Outlineimg;//二值图 Mat PointMat(Size(8, 8), Outlineimg.type());//8*8矩阵 用于存储角点附近图像 int BeginY = corners[num].y - 4, BeginX = corners[num].x - 4;//取点起始位 int EndY = corners[num].y + 4 , EndX = corners[num].x + 4;//取点终止位 for (int i = BeginY ; i PointMat.at(i - BeginY, j - BeginX) = Outlineimg.at(i, j); } } imshow("show PointMat", PointMat);//打印角点附近图像显示的角点附近图像如下: 存在问题:如果角点为与图像边界相邻的点时,那么在访问图像像素的时候,就可能发生访问越界的情况,而导致程序崩溃 解决方法:可以根据corners角点当前坐标与Mat图像尺寸来计算获取角点附近8*8像素图像所需的偏移量 代码如下 vector DocScan::CalPixValue(Mat& Outlineimg, vector& corners)//计算corners的像素值 { Mat PointMat(Size(8, 8), Outlineimg.type()); vector Markcorners; for (char num=0;num dx = 4 - corners[num].x; }else if (Outlineimg.cols - corners[num].x dy = 4 - corners[num].y; }else if (Outlineimg.rows - corners[num].y for (int j = BeginX; j ++whitenum; } } } if (whitenum >= 9)//如果白色像素数量>=9则可能为角点(不是太准确,具体参数根据个人需求修改) { cout |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |